<?php

App::uses('AppController', 'Controller');

class RutasController extends AppController {
    /**
     * 				CONTROLLER DATA MEMBERS
     */

    /**
     * Nombre del controlador
     *
     * Nombre del controlador
     *
     * @var string
     */
    public $name = "Rutas";

    /**
     * Modelos que utiliza
     *
     * Los modelos que usa el controller. Por defecto
     * cake usa el singular basado en el nombre del modelo,
     * pero por asuntos del idioma siempre se ingresa el modelo
     * para evitar posibles problemas.
     *
     * @var array(string)
     */
    public $uses = array('Ruta', 'Parada', 'WaypointAyuda', 'RutaParada');

    /**
     * Componentes que utiliza
     *
     * Componentes que utiliza el controlador
     *
     * @var array(string)
     */
    public $components = array("Session");  //make available packages of logic that are shared between controllers

    /**
     * 				CONTROLLER CALLBACKS METHODS
     */

    // public function beforeFilter() {
    // }
    // public function afterFilter() {
    // }
    // public function beforeRender() {
    // }

    /**
     * 				CONTROLLER METHODS (ACTIONS)
     */

    /**
     * Action por defecto para las rutas
     *
     * Este es el metodo base de las rutas, en este metodo
     * se buscan las rutas almacenadas en el sistema y se
     * devuelven a la vista para que el usuario pueda realizar
     * acciones sobre ellas
     *
     * @return void
     */
    public function index() {

    }

    public function retrieve_all() {
        if ($this->request->is('ajax')) {
            $data = $this->request->data;

            foreach ($data['order'] as $i => $order) {
                $data['order'][$i] = array(
                    'column' => $data['columns'][$data['order'][$i]['column']]['data'],
                    'direction' => strtoupper($data['order'][$i]['dir'])
                );
            }

            $filter = array();
            foreach ($data['columns'] as $i => $column) {
                if ($column['searchable'] === "true" && !empty($column['search']['value'])) {
                    $filter[] = array(
                        'column' => $column['name'],
                        'value' => $column['search']['value']
                    );
                }
            }

            $models = $this->Ruta->findAll($start = $data['start'], $length = $data['length'], $order = $data['order'], $filter);
            $totalWithFilter = $this->Ruta->findCountAll($filter);
            $total = $this->Ruta->findCountAll();

            $this->set(array(
                'draw' => $data['draw'],
                'results' => $models,
                'recordsTotal' => $total,
                'recordsFiltered' => $totalWithFilter
            ));
            $this->set('_serialize', array('results', 'recordsTotal', 'draw', 'recordsFiltered'));
        } else {
            $this->autoRender = false;
        }
    }

    /**
     * Consultar la información de una ruta especifica
     *
     * En este metodo se busca la ruta según el parametro de
     * entrada $id, si dicho parametro es nulo o si no se encuentra
     * una ruta con ese identificador asociado se devuelve un error.
     * Por otro lado, si se encuentra la ruta, se devuelve su
     * información a la vista para que sea procesada.
     *
     *
     * @param int $id identifiacador de la ruta que se va a buscar.
     * @return void
     */
    public function ver($id = null) {
        if (!$id) {
            throw new NotFoundException('Ruta inválida');
        }

        $ruta = $this->Ruta->findByid_ruta($id);
        if (!$ruta) {
            $this->Session->setFlash('Ruta inválida');
            throw new NotFoundException('Ruta inválida');
        }
        $this->set('ruta', $ruta);
    }

    /**
     * Adicionar una nueva ruta
     *
     * Encargado de enviar a la vista todas las paradas activas y,
     * cuando haya un request por post, agregar una ruta nueva
     *
     * @return void
     */
    public function agregar() {
        $this->set("paradas", $this->Parada->find('all', array(
                    'conditions' => array('Parada.estado_parada' => 'activa'))//,'fields' => array('Parada.longitud','Parada.latitud','Parada.nombre_parada', 'Parada.id_parada'))
        ));

        $this->set("paradas2", $this->Parada->find('list', array(
                    'conditions' => array('Parada.estado_parada' => 'activa')
        )));

        if ($this->request->is('post')) {
            $this->Ruta->create();
            try {
                if ($this->Ruta->guardarRutasParadas($this->request->data)) {
                    $this->Session->setFlash('Ruta guardada exitosamente');
                    $this->redirect(array('action' => 'index'));
                } else {
                    $this->Session->setFlash('Ruta no guardada');
                }
            } catch (Exception $e) {
                if ($e->getMessage() == 'parada_origen_destino_requerida') {
                    $this->Session->setFlash('Debe haber una parada de origen y destino como mínimo');
                } else if ($e->getMessage() == 'misma_parada_consecutiva') {
                    $this->Session->setFlash('La misma parada no puede ser consecutiva');
                }
            }
        }
    }

    /**
     * Editar una ruta previamente almacenada
     *
     * Se verifica que el parametro $id no sea nulo y luego se busca la
     * ruta a editar, en caso de tener el parametro vacio o de no
     * encontrar la ruta se lanza una exception con el mensaje de
     * error correspondiente. Posteriormente se verifica si se están
     * almacenando los nuevos datos de la ruta, de ser asi se guardan
     * estos nuevos datos y el metodo termina. De lo contrario se asume
     * que se esta haciendo un get de la vista de editar y por eso se
     * devuelven los datos de la ruta para que sean presentados en la
     * vista de edición.
     *
     * @param int $id identifiacador de la ruta que se va a editar.
     * @return void
     */
    public function editar($id = null) {
        if (!$id) {
            throw new NotFoundException('Ruta inválida');
        }
        $ruta = $this->Ruta->find('all', array(
            'conditions' => array('Ruta.id_ruta' => $id),
            'recursive' => 1
        ));
        if (!$ruta) {
            throw new NotFoundException('Ruta inválida');
        }
        $idparadas = array();
        foreach ($ruta[0]['RutaParada'] as $i => $detallesRutaParada) {
            $idparadas[] = $detallesRutaParada['id_parada'];
        }

        $paradas2 = array();
        $paradas = $this->Parada->find('all', array());

        foreach ($paradas as $i => $parada) {
            if (!in_array($parada["Parada"]["id_parada"], $idparadas) && $parada["Parada"]["estado_parada"] == "inactiva") {
                unset($paradas[$i]);
            } else {
                $paradas2[$parada["Parada"]["id_parada"]] = $parada["Parada"]["nombre_parada"];
            }
        }
        $paradasn = array();
        foreach ($paradas as $paradan) {
            $paradasn[] = $paradan;
        }
        $paradas = $paradasn;

        $this->set("paradas2", $paradas2);
        $this->set("paradas", $paradas);

        $this->set("wayayuda", $wsa = $this->WaypointAyuda->find('all', array(
            'conditions' => array('WaypointAyuda.id_ruta' => $id),
            'recursive' => -1,
        )));
        if ($this->request->is('post') || $this->request->is('put')) {
            $this->request->data['Ruta']['id_ruta'] = $id;
            try {
                if ($this->Ruta->guardarRutasParadas($this->request->data)) {
                    $this->Session->setFlash('Ruta actualizada exitosamente');
                    $this->redirect(array('action' => 'index'));
                } else {
                    $this->Session->setFlash('Ruta no actualizada');
                }
            } catch (Exception $e) {
                if ($e->getMessage() == 'parada_origen_destino_requerida') {
                    $this->Session->setFlash('Debe haber una parada de origen y destino como mínimo');
                } else if ($e->getMessage() == 'misma_parada_consecutiva') {
                    $this->Session->setFlash('La misma parada no puede ser consecutiva');
                }
            }
        }

        if (!$this->request->data) {
            $this->request->data = $ruta[0];
        }
    }

    /**
     * Borra una ruta de la base de datos
     *
     * Se verifica que el request no sea un get para
     * minimzar la probabilidad de errores. Luego se borra la ruta
     * indicada.
     *
     * @param int $id identifiacador de la ruta que se va a borrar.
     * @return void
     */
    public function borrar($id) {
        if ($this->Ruta->delete($id)) {
            $this->Session->setFlash('Ruta con id: ' . $id . ' ha sido borrada exitosamente');
        } else {
            $this->Session->setFlash('La Ruta no pudo borrarse');
        }

        $this->redirect(array('action' => 'index'));
    }

    public function paradas_por_ruta($id) {
        $this->autoRender = false;
        if (!$id) {
            throw new NotFoundException('Ruta inválida');
        }
        $rutasparadas = $this->RutaParada->find('all', array(
            'conditions' => array('RutaParada.id_ruta' => $id),
            'recursive' => 0,
        ));
        $paradas = array();
        foreach ($rutasparadas as $rp) {
            $paradas[] = $rp["Parada"];
        }
        echo json_encode($paradas, JSON_UNESCAPED_UNICODE);
    }

}
